惰性删除
redis将设置了过期时间的key放到一个独立的字典里面,以后定时遍历这个字典来删除到期的key,同时采用惰性原则,当客户端访问这个key的时候,redis会对其进行检查,如果过期了,那么立即删除。
定时策略
redis默认每秒10次扫描过期字典的key,不是遍历,而是一种贪心策略。
1.从过期字典随机20个key。
2.删除这20个key里面过期的key。
3.如果过期的key>1/4,那就重复1.
同时为了避免循环过度,造成线程卡死,算法还设置了一个时间上限,默认不超过25ms。
不要用大量key同一时间过期,会导致系统卡顿。因为卡顿是很多小卡顿积累出来的。
从库的删除策略
从库不会进行过期扫描,从库的处理是被动的。主库key到期后,会在aof文件里面增加一个del指令,同步到所以的从库。
真删除 del
redis的单线程是指接受客户端请求的时候是单线程,基于多路io复用,但是redis里面还是有多个异步子线程来进行一些耗时操作的。
比如:del删除指令会直接释放对象的内存,对于小对象来说,无所谓,秒删,但是对于大的数据,hash,那么就会造成单线程卡顿,redis提供了一个叫unlink的指令,对删除进行懒操作处理。对给后台线程异步回收内存。同时使用这个指令后,主线程就无法访问到了。
主线程执行这个指令后,就会将这个key的内存回收操作包装为一个任务,塞进异步任务队列,后台线程就会从这个异步队列里面取任务,然后执行。
Aof sync 操作中一秒一次增量同步,需要频繁磁盘io,耗时,于是也有一个子线程来异步后台处理